package com.atguigu.yygh.hosp.controller;

import com.atguigu.yygh.hosp.repository.DepartmentRepository;
import com.atguigu.yygh.hosp.result.R;
import com.atguigu.yygh.hosp.service.DepartmentService;
import com.atguigu.yygh.model.hosp.Department;
import com.atguigu.yygh.vo.hosp.DepartmentVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/admin/hosp/department")
public class DepartmentController {
    @Autowired
    DepartmentService departmentService;
    @Autowired
    DepartmentRepository departmentRepository;

    /**
     * 根据医院编号获取科室列表数
     * 大科室集合
     * [
     *   {
     *       depname:"大科室名称",
     *       depcode:"大科室编号",
     *       children:[
     *                   {
     *                       depname:'小科室名称',
     *                       depcode:'小科室编号',
     *                       children:null
     *                   }
     *                ]
     *   }
     * ]
     * =====需要一个自定义的实体类,封装科室对象,需要哪些属性(depcode,depname,children)===>departmentVo
     * @return
     */
    @GetMapping("/findDeptTree/{hoscode}")
    public R findDeptTree(@PathVariable("hoscode") String hoscode){
        //查询该医院下的所有小科室
        List<Department> list = departmentRepository.findByHoscode(hoscode);

        //小科室集合按照bigcode分组,分了多少组,就说明有多少不同的大科室
        //key:bigcode value:bigcode相同的一组小科室集合
        //以Department里面的bigcode来进行分组
        //collect 是一个 Map<String, List<Department>> 类型的变量，用于存储分组后的结果
       // Collectors.groupingBy(Department::getBigcode) 是一个收集器（Collector），
        // 它接受一个分类函数作为参数。在这里，Department::getBigcode 是一个方法引用，
        // 表示使用 Department 对象的 getBigcode 方法作为分类函数。
        Map<String, List<Department>> map = list.stream().collect(Collectors.groupingBy(Department::getBigcode));

        //定义大科室集合
        List<DepartmentVo> bigDeptList=new ArrayList<>();

        //无论是大科室对象还是小科室对象,都封装成DepartmentVo
        for (Map.Entry<String, List<Department>> entry : map.entrySet()) {
            String key = entry.getKey();  //大科室编号  bigcode
            List<Department> value = entry.getValue();  //当前大科室下的所有小科室集合(这些小科室的bigcode和bigname都是相同的)

            //封装成大科室对象
            DepartmentVo bigDept=new DepartmentVo();
            bigDept.setDepcode(key);   //大科室编号
            bigDept.setDepname(value.get(0).getBigname()); //大科室名称


            //小科室集合
            List<DepartmentVo> children = new ArrayList<>();
            value.forEach(department -> {
                //每个Department小科室,转成DepartmentVo类型
                DepartmentVo smallDept=new DepartmentVo();
                smallDept.setDepcode(department.getDepcode());  //小科室编号
                smallDept.setDepname(department.getDepname());  //小科室名称
                smallDept.setChildren(null);
                children.add(smallDept);
            });

            bigDept.setChildren(children); //该大科室下小科室集合  List<Department> value ==> List<DepartmentVo> value

            //bigDeptList大科室集合
            bigDeptList.add(bigDept);
        }

        return R.ok().data("list",bigDeptList);
    }
}
